package es.tikitaka.domain.usuarios;

import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.validator.Email;
import org.jboss.seam.annotations.Name;

import es.tikitaka.dictionary.MunicipioDic;
import es.tikitaka.dictionary.PerfilDic;
import es.tikitaka.dictionary.ProvinciaDic;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Entity
@Table(name = "USUARIO")
@Name("usuario")
public class Usuario {

	private Integer id;
	private String nombre;
	private String apellidos;
	private String direccion;
	private ProvinciaDic provincia;
	private MunicipioDic municipio;
	private String username;
	private String password;
	private String email;
	private PerfilDic perfil;
	private Set<Comite> m_comites;
	private Set<EqMantenimiento> m_eqMantenimiento;

	/**
	 * Constructor por defecto
	 */
	public Usuario() {
		// TODO Auto-generated constructor stub
	}

	/*
	 * getters and setters
	 */

	/**
	 * @return id Id del usuario
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USU_GEN")
	@SequenceGenerator(allocationSize = 1, name = "USU_GEN", sequenceName = "USU_SEQ")
	@Column(name = "X_USER", nullable = false, precision = 10, scale = 0)
	public Integer getId() {
		return id;
	}

	/**
	 * 
	 * @param id
	 *            Id
	 */
	public void setId(Integer id) {
		this.id = id;
	}

	/**
	 * 
	 * @return nombre Nombre del usuario
	 */
	@Column(name = "NOMBRE")
	public String getNombre() {
		return nombre;
	}

	/**
	 * 
	 * @param nombre
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * 
	 * @return apellidos Apellidos del usuario
	 */
	@Column(name = "APELLIDOS")
	public String getApellidos() {
		return apellidos;
	}

	/**
	 * 
	 * @param apellidos
	 */
	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}

	/**
	 * 
	 * @return direccion Dirección del usuario
	 */
	@Column(name = "DIRECCION")
	public String getDireccion() {
		return direccion;
	}

	/**
	 * 
	 * @param direccion
	 */
	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}

	/**
	 * 
	 * @return provincia Provincia del usuario
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "PROVINCIA")
	public ProvinciaDic getProvincia() {
		return provincia;
	}

	/**
	 * 
	 * @param provincia
	 *            ProvinciaDic
	 */
	public void setProvincia(ProvinciaDic provincia) {
		this.provincia = provincia;
	}

	/**
	 * 
	 * @return municipio Municipio del usuario
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "MUNICIPIO")
	public MunicipioDic getMunicipio() {
		return municipio;
	}

	/**
	 * 
	 * @param municipio
	 *            MunicipioDic
	 */
	public void setMunicipio(MunicipioDic municipio) {
		this.municipio = municipio;
	}

	/**
	 * 
	 * @return username Nombre de usuario
	 */
	@Column(name = "USERNAME")
	public String getUsername() {
		return username;
	}

	/**
	 * 
	 * @param username
	 */
	public void setUsername(String username) {
		this.username = username;
	}

	/**
	 * 
	 * @return password Contraseña de la cuenta de usuario
	 */
	@Column(name = "PASSWORD")
	public String getPassword() {
		return password;
	}

	/**
	 * 
	 * @param password
	 */
	public void setPassword(String password) {
		this.password = password;
	}

	/**
	 * 
	 * @return email Email de contacto del usuario
	 */
	@Column(name = "EMAIL")
	@Email
	public String getEmail() {
		return email;
	}

	/**
	 * 
	 * @param email
	 */
	public void setEmail(String email) {
		this.email = email;
	}

	/**
	 * 
	 * @return perfil PerfilDic tipo de usuario dentro de la apliacación
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "PERFIL")
	public PerfilDic getPerfil() {
		return perfil;
	}

	/**
	 * 
	 * @param perfil
	 *            PerfilDic
	 */
	public void setPerfil(PerfilDic perfil) {
		this.perfil = perfil;
	}

	/**
	 * 
	 * @return m_comites Conjunto de comites a los que ha pertenecido el usuario
	 */
	@Column(name = "M_COMITES")
	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name = "USUARIOS_COMITE")
	public Set<Comite> getM_comites() {
		return m_comites;
	}

	/**
	 * 
	 * @param m_comites
	 */
	public void setM_comites(Set<Comite> m_comites) {
		this.m_comites = m_comites;
	}

	/**
	 * 
	 * @return m_eqMantenimiento Conjunto de equipos de mantenimiento a los que
	 *         ha pertenecido el usuario
	 */
	@Column(name = "M_EQMANTENIMIENTO")
	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name = "USUARIOS_MANTENIMIENTO")
	public Set<EqMantenimiento> getM_eqMantenimiento() {
		return m_eqMantenimiento;
	}

	/**
	 * 
	 * @param mantenimiento
	 */
	public void setM_eqMantenimiento(Set<EqMantenimiento> mantenimiento) {
		m_eqMantenimiento = mantenimiento;
	}

	/**
	 * Método equals
	 */
	@Override
	public boolean equals(Object obj) {
		if (!(obj instanceof Usuario)) {
			return false;
		}
		if (obj != null) {
			if (this.id == ((Usuario) obj).getId()) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Método hashCode
	 */
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return super.hashCode();
	}

}
